package ar.com.sgsvm.dao.sqlite;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import ar.com.sgsvm.dao.IUsuarioDao;
import ar.com.sgsvm.dao.SqliteDaoFactory;
import ar.com.sgsvm.entity.Usuario;
import ar.com.sgsvm.exceptions.NonexistentEntityException;

public class UsuarioSqliteDao implements IUsuarioDao {

	@Override
	public Long create(Usuario usuario) throws Exception {
		ContentValues contentValues = new ContentValues();
		contentValues.put("idTipoUsuario", usuario.getTipoUsuario().getIdTipoUsuario());
		contentValues.put("nombre", usuario.getNombre());
		contentValues.put("clave", usuario.getClave());
		SqliteDaoFactory sqliteDaoFactory = new SqliteDaoFactory();
		return sqliteDaoFactory.open().insert("Usuario", null, contentValues);
	}

	@Override
	public List<Usuario> readAll() throws Exception {
		SqliteDaoFactory sqliteDaoFactory = new SqliteDaoFactory();
		SQLiteDatabase sqliteDatabase = sqliteDaoFactory.open();
		Cursor cursor = sqliteDatabase.query("Usuario", null, null, null, null, null, null);
		List<Usuario> usuarios = new ArrayList<Usuario>();
		if (cursor.moveToFirst()) {
			do {
				Usuario usuario = new Usuario();
				usuario.setIdUsuario(cursor.getLong(cursor.getColumnIndex("idUsuario")));
				usuario.setTipoUsuario(sqliteDaoFactory.getTipoUsuarioDao().readById(cursor.getLong(cursor.getColumnIndex("idTipoUsuario"))));
				usuario.setNombre(cursor.getString(cursor.getColumnIndex("nombre")));
				usuario.setClave(cursor.getString(cursor.getColumnIndex("clave")));
				usuarios.add(usuario);
			} while (cursor.moveToNext());
		}
		cursor.close();
		return usuarios;
	}

	@Override
	public Usuario readById(Long idUsuario) throws Exception {
		SqliteDaoFactory sqliteDaoFactory = new SqliteDaoFactory();
		SQLiteDatabase sqliteDatabase = sqliteDaoFactory.open();
		Cursor cursor = sqliteDatabase.query("Usuario", null, "idUsuario = ?", new String[] { String.valueOf(idUsuario) }, null, null, null);
		if (cursor.moveToFirst()) {
			Usuario usuario = new Usuario();
			usuario.setIdUsuario(idUsuario);
			usuario.setTipoUsuario(sqliteDaoFactory.getTipoUsuarioDao().readById(cursor.getLong(cursor.getColumnIndex("idTipoUsuario"))));
			usuario.setNombre(cursor.getString(cursor.getColumnIndex("nombre")));
			usuario.setClave(cursor.getString(cursor.getColumnIndex("clave")));
			cursor.close();
			return usuario;
		} else {
			throw new NonexistentEntityException("No existe el usuario con id " + String.valueOf(idUsuario));
		}

	}

	@Override
	public void update(Usuario usuario) throws Exception {
		ContentValues contentValues = new ContentValues();
		contentValues.put("idTipoUsuario", usuario.getTipoUsuario().getIdTipoUsuario());
		contentValues.put("nombre", usuario.getNombre());
		contentValues.put("clave", usuario.getClave());
		SqliteDaoFactory sqliteDaoFactory = new SqliteDaoFactory();
		sqliteDaoFactory.open().update("Usuario", contentValues, "idUsuario = ?", new String[] { String.valueOf(usuario.getIdUsuario()) });
	}

	@Override
	public void delete(Usuario usuario) throws Exception {
		SqliteDaoFactory sqliteDaoFactory = new SqliteDaoFactory();
		sqliteDaoFactory.open().delete("Usuario", "idUsuario = ?", new String[] { String.valueOf(usuario.getIdUsuario()) });
	}

	@Override
	public Usuario readByNombre(String nombre) throws Exception {
		SqliteDaoFactory sqliteDaoFactory = new SqliteDaoFactory();
		SQLiteDatabase sqliteDatabase = sqliteDaoFactory.open();
		Cursor cursor = sqliteDatabase.query("Usuario", null, "nombre = ?", new String[] { nombre }, null, null, null);
		if (cursor.moveToFirst()) {
			Usuario usuario = new Usuario();
			usuario.setIdUsuario(cursor.getLong(cursor.getColumnIndex("idUsuario")));
			usuario.setTipoUsuario(sqliteDaoFactory.getTipoUsuarioDao().readById(cursor.getLong(cursor.getColumnIndex("idTipoUsuario"))));
			usuario.setNombre(nombre);
			usuario.setClave(cursor.getString(cursor.getColumnIndex("clave")));
			cursor.close();
			return usuario;
		} else {
			throw new NonexistentEntityException("No existe el usuario con nombre " + nombre);
		}
	}

}
